package ar.fiuba.tp7552.buildadmin.webactions.builds;

import java.util.Collection;

import org.apache.commons.lang.StringUtils;

import ar.fiuba.tp7552.buildadmin.model.BusinessException;
import ar.fiuba.tp7552.buildadmin.model.builds.Edificio;
import ar.fiuba.tp7552.buildadmin.model.builds.Propiedad;
import ar.fiuba.tp7552.buildadmin.model.builds.Responsable;
import ar.fiuba.tp7552.buildadmin.model.builds.TipoPropiedad;
import ar.fiuba.tp7552.buildadmin.service.EdificioService;
import ar.fiuba.tp7552.buildadmin.service.PropiedadService;
import ar.fiuba.tp7552.buildadmin.service.ResponsableService;
import ar.fiuba.tp7552.buildadmin.webactions.BaseAction;

import com.opensymphony.xwork2.Preparable;

public class PropiedadAction extends BaseAction implements Preparable {
	
	private PropiedadService propiedadService;
	private EdificioService edificioService;
	private ResponsableService responsableService;
	private Edificio edificio;
	private Propiedad propiedad;
	private Responsable propietario = new Responsable();
	private Responsable inquilino;
	private Responsable apoderado;
	private boolean hasInquilino = false;
	private boolean hasApoderado = false;

	// ~~ Constructor ====================================================

	public PropiedadAction(PropiedadService propiedadService, EdificioService edificioService, ResponsableService responsableService) {
		super();
		this.propiedadService = propiedadService;
		this.edificioService = edificioService;
		this.responsableService = responsableService;
	}
	
	// ~~ Actions ========================================================

	@Override
	public void prepare() throws Exception {
		if (propiedad != null && propiedad.getId() != null) {
			propiedad = propiedadService.get(propiedad.getId());
			edificio  = propiedad.getTipo().getEdificio();
			if (!(propietario.getId() == null || propiedad.getPropietario().getId().equals(propietario.getId()))) {
				propietario = responsableService.get(propietario.getId());
			} if (propiedad.getPropietario().getId().equals(propietario.getId())) {
				propietario = propiedad.getPropietario();
			} else {
				if (propietario != null && StringUtils.isEmpty(propietario.getNombre())) {
					propietario = propiedad.getPropietario();
				}
			}
			
			if ( propiedad.getInquilino() != null ) {
				if (inquilino != null && inquilino.getId() != null) {
					if ( inquilino.getId().equals(propiedad.getInquilino()) ) {
						inquilino = propiedad.getInquilino();
						hasInquilino = true;
					} else {
						inquilino = responsableService.get(inquilino.getId());
						hasInquilino = true;
					}
				} else {
					if (inquilino == null) {
						inquilino = propiedad.getInquilino();
						hasInquilino = true;
					} else {
						if (StringUtils.isNotEmpty(inquilino.getNombre())) {
							hasInquilino = true;
						} else {
							inquilino = null;
							hasInquilino = false;
						}
					}
				}
			} else {
				if (inquilino != null && inquilino.getId() != null) {
					inquilino = responsableService.get(inquilino.getId());
					hasInquilino = true;
				} else {
					if (inquilino != null && StringUtils.isNotEmpty(inquilino.getNombre())) {
						hasInquilino = true;
					} else {
						inquilino = null;
						hasInquilino = false;
					}
				}
			}
			
			if ( propiedad.getApoderado() != null ) {
				if (apoderado != null && apoderado.getId() != null) {
					if ( apoderado.getId().equals(propiedad.getApoderado()) ) {
						apoderado = propiedad.getApoderado();
						hasApoderado = true;
					} else {
						apoderado = responsableService.get(apoderado.getId());
						hasApoderado = true;
					}
				} else {
					if (apoderado == null) {
						apoderado = propiedad.getApoderado();
						hasApoderado = true;
					} else {
						if (StringUtils.isNotEmpty(apoderado.getNombre())) {
							hasApoderado = true;
						} else {
							apoderado = null;
							hasApoderado = false;
						}
					}
				}
			} else {
				if (apoderado != null && apoderado.getId() != null) {
					apoderado = responsableService.get(apoderado.getId());
					hasApoderado = true;
				} else {
					if (apoderado != null && StringUtils.isNotEmpty(apoderado.getNombre())) {
						hasApoderado = true;
					} else {
						apoderado = null;
						hasApoderado = false;
					}
				}
			}
			
		
		} else if (edificio!=null && edificio.getId()!=null) {
			edificio = edificioService.get(edificio.getId());
		}
	}
	
	public String load() {
		return BaseAction.SUCCESS;
	}
	
	/** Crea o actualiza un propiedad. */
	public String save() throws BusinessException {
		propiedad.setPropietario(propietario);
		
		if (hasInquilino) {
			if (StringUtils.isEmpty(inquilino.getNombre())) {
				this.addFieldError("inquilino.nombre", "Ingrese el nombre del inquilino");
				return BaseAction.INPUT;
			}
			propiedad.setInquilino(inquilino);
		}
		else
			propiedad.setInquilino(null);
		
		if (hasApoderado) {
			if (StringUtils.isEmpty(apoderado.getNombre())) {
				this.addFieldError("apoderado.nombre", "Ingrese el nombre del apoderado");
				return BaseAction.INPUT;
			}
			propiedad.setApoderado(apoderado);
		} else
			propiedad.setApoderado(null);
		
		if (propiedad != null && propiedad.isNew()) {
			propiedadService.createPropiedad(propiedad);
		} else {
			propiedadService.update(propiedad);
		}
		return BaseAction.SUCCESS;
	}
	
	public String delete() {
		propiedadService.delete(propiedad);
		return BaseAction.SUCCESS;
	}

	public Collection<TipoPropiedad> getTipoProps(){
		return edificio.getTipoProps();
	}

	// ~~ getters y setters ========================================================
	public Edificio getEdificio() {
		return edificio;
	}
	public void setEdificio(Edificio edificio) {
		this.edificio = edificio;
	}
	public Propiedad getPropiedad() {
		return propiedad;
	}
	public void setPropiedad(Propiedad propiedad) {
		this.propiedad = propiedad;
	}
	public Responsable getPropietario() {
		return propietario;
	}
	public void setPropietario(Responsable propietario) {
		this.propietario = propietario;
	}
	public Responsable getInquilino() {
		return inquilino;
	}
	public void setInquilino(Responsable inquilino) {
		this.inquilino = inquilino;
	}
	public Responsable getApoderado() {
		return apoderado;
	}
	public void setApoderado(Responsable apoderado) {
		this.apoderado = apoderado;
	}
}
